home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / dviapollo / genwindow.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  4KB  |  151 lines

  1. /*
  2.   Modified on 27-Sep-87 by Leonard N. Zubkoff:
  3.     Do not draw borders on APOLLO.
  4. */
  5.  
  6. #include "header.h"
  7. #include "genwindow.h"
  8. #include <sys/types.h>
  9. #include <sys/stat.h>
  10. char *malloc();
  11. void shownextpage();
  12. void open_dvi_file ();
  13.  
  14. void CloseDvi (dviw)
  15.      DVIW dviw;
  16. {
  17.   close_fonts ();
  18.   fclose (dviw -> dvifp);
  19.   free (dviw -> filename);
  20.   free (dviw);
  21. };
  22.  
  23. DVIW OpenDvi (filename)
  24.      char *filename;
  25. {
  26.   return (ReOpenDvi (NULL, filename));
  27. }
  28.  
  29. /* This takes dviw by reference because it will change dviw if the dvi */
  30.  /* file has been modified since it was opened.  This tends to prevent */
  31.  /* horrible things from happening when you use latex to regenerate a */
  32.  /* file you are displaying. */
  33. int ShowDviPage (dviw, pagenum, xscreen, yscreen)
  34.      DVIW *dviw;
  35.      int pagenum;
  36.      int xscreen;
  37.      int yscreen;
  38. {
  39.   if (modtime ((*dviw)->filename) != (*dviw) -> modtime) {
  40.     /* The file has been modified since last opened. */
  41.     char *filetmp = malloc (strlen ((*dviw) -> filename) + 1);
  42.  
  43.     strcpy (filetmp, (*dviw) -> filename);
  44.     *dviw = ReOpenDvi (*dviw, filetmp);
  45.     free (filetmp);
  46.     showerror ("Your file changed.");
  47.   } else {
  48.     clearerror ();
  49.   };
  50.   if (pagenum > (*dviw) -> pages) {
  51.     pagenum = (*dviw) -> pages;
  52.   } else if (pagenum <= 0) {
  53.     pagenum = 1;
  54.   };
  55.   clearscreen ();
  56.   lock_canvas ();
  57. #ifndef apollo
  58.   draw_borders ();
  59. #endif
  60.   if (pagenum == (*dviw) -> pagenum) {
  61.     check (fseek ((*dviw) -> dvifp, (*dviw) -> cpagep, 0));
  62.     shownextpage (*dviw, xscreen, yscreen);
  63.   } else if (pagenum == ((*dviw) -> pagenum + 1)) {
  64.     shownextpage (*dviw, xscreen, yscreen);
  65.   } else if (pagenum > ((*dviw) -> pagenum)) {
  66.     showpage (&((*dviw) -> cpagep), &((*dviw) -> ppagep), TRUE,
  67.           pagenum - ((*dviw) -> pagenum),
  68.           FALSE, (*dviw) -> dvifp, xscreen, yscreen);
  69.     (*dviw) -> pagenum = pagenum + 1;
  70.   } else if (pagenum < ((*dviw) -> pagenum)) {
  71.     while ((pagenum < ((*dviw) -> pagenum)--) && (*dviw) -> ppagep != -1) {
  72.       /* Each iteration here backs up a page. */
  73.       check (fseek((*dviw) -> dvifp, (*dviw) -> ppagep, 0));
  74.       Nosignextend((*dviw) -> dvifp, 1);
  75.       {
  76.     int i;
  77.     for(i=0; i<=9; i++)
  78.       Nosignextend((*dviw) -> dvifp, 4);
  79.       }
  80.       (*dviw) -> cpagep = (*dviw) -> ppagep;
  81.       (*dviw) -> ppagep = Nosignextend ((*dviw) -> dvifp, 4);
  82.     }
  83.     check(fseek((*dviw)->dvifp,(*dviw)->cpagep,0));
  84.     shownextpage (*dviw, xscreen, yscreen);
  85.   } else {
  86.     fprintf (stderr, "Terminal confusion in ShowDviPage.\n");
  87.     exit (1);
  88.   };
  89.   unlock_canvas ();
  90.   (*dviw) -> pagenum = pagenum;
  91.   return (pagenum);
  92. }
  93.  
  94. void shownextpage (dviw, xscreen, yscreen)
  95.      DVIW dviw;
  96.      int xscreen, yscreen;
  97. {
  98.     showpage (&(dviw -> cpagep), &(dviw -> ppagep), FALSE, 0, FALSE,
  99.           dviw -> dvifp, xscreen, yscreen);
  100. }  
  101.      
  102. /* Open a dvi file for input and display the first page.  If
  103.    something goes wrong, display an error and leave the current file
  104.    unaffected. Historical potential bug:  After this routine is
  105.    called, the first page displayed may have to be the first page in
  106.    the document.*/ 
  107. DVIW ReOpenDvi (olddvi, filename)
  108.      DVIW olddvi;
  109.      char *filename;
  110. {
  111.   FILE *newfp;
  112.   DVIW newdvi;
  113.  
  114.   preload = TRUE;
  115.    /* We have to explictly test for an empty file name here because of */
  116.   /* a Sun stdio bug. */
  117.   if ((*filename == '\0') || (newfp=fopen(filename,"r")) == NULL)  {
  118.     showerror ("Can't open your file.");
  119.     return (olddvi);
  120.   } else if ((Nosignextend(newfp, 1)) != PRE)  {
  121.     showerror ("Not a DVI file.");
  122.     fclose (newfp);
  123.     return (olddvi);
  124.   } else if (signextend (newfp, 1) != DVIFORMAT) {
  125.     showerror ("Wrong DVI file format.");
  126.     fclose (newfp);
  127.     return (olddvi);
  128.   } else {
  129.     clearerror ();
  130.     if (olddvi != NULL) CloseDvi (olddvi);
  131.     newdvi = NEWDVIW;
  132.     newdvi -> filename = malloc (strlen (filename) + 1);
  133.     strcpy (newdvi -> filename, filename);
  134.     newdvi -> modtime = modtime (filename);
  135.     newdvi -> dvifp = newfp;
  136.     newdvi -> pages = start_reading_dvi_file (newdvi -> dvifp);
  137.     newdvi -> pagenum = 0;
  138.     newdvi -> cpagep = -1;
  139.     newdvi -> ppagep = -1;
  140.     return (newdvi);
  141.   }
  142. }
  143.  
  144. int modtime (filename)
  145.      char *filename;
  146. {
  147.   struct stat buf;
  148.   check (stat (filename, &buf));
  149.   return (buf.st_mtime);
  150. }
  151.